#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//第六讲:函数
//is_leap_year(int year)
//{
//	return (year % 100 == 0 || (year % 4 == 0 && year % 100 != 0));
//}
//int get_days(int year, int mouth)
//{
//	int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//	if(mouth == 2 &&is_leap_year(year))
//	{
//		return 29;
//	}
//	return arr[mouth];
//}
//int main()
//{

	// ***********************
	//7. 嵌套调⽤和链式访问
	// ***********************
	//7.1 嵌套调⽤
	//练习:计算某年某⽉有多少天？
//	int year = 0;
//	int mouth = 0;
//	scanf("%d %d", &year, &mouth);
//	int day = get_days(year, mouth);
//	printf("%d年 %d月 有%d天 ", year, mouth, day);
//	return 0;
//}

//7.2 链式访问
//所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数，像链条⼀样将函数串起来就是函数
//的链式访问。
//int main()
//{
//	printf("%d\n", strlen("abcdef"));
//	printf("%d", printf("%d", printf("%d", 43)));//如果打印成功的话printf返回值是打印在屏幕上的字符个数(打印错误会返回一个负数)
//	return 0;
//}


//********************
//8. 函数的声明和定义
//********************
//8.1 单个⽂件内部的函数声明和定义:
//int main()
//{
//	int is_leap_year(int y);//函数的声明 其中y可以省略
//	int y = 0;
//	scanf("%d", &y);
//	int r = is_leap_year(y);
//	if (r == 1)
//		printf("闰年\n");
//	else
//		printf("⾮闰年\n");
//	return 0;
//}
//int is_leap_year(int y)
//{
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
//		return 1;
//	else
//		return 0;
//}

//8.2 多个⽂件
//#include"add.h"
//int main()
//{
//	int a = 10;
//	int b = 20;
//	//函数调⽤
//	int c = Add(a, b);
//	printf("%d\n", c);
//	return 0;
//}
//也可以不需要头文件和包含头文件，只需要声明来自外部的函数即可:extern int Add(int,int)


//拓展:想要别人使用自己的代码但是不想让别人看到源代码:
//导入静态库
//#pragma comment(lib,"add.lib")
//int main()
//{
//	int a = 10;
//	int b = 20;
//	//函数调⽤
//	int c = Add(a, b);
//	printf("%d\n", c);
//	return 0;
//}

//作用域:名字在哪里可以使用哪里就是他的作用域
//1. 局部变量的作⽤域是变量所在的局部范围。
//2. 全局变量的作⽤域是整个⼯程（项⽬）。
//extern int g_val;//g_val属于全局变量,只不过在外部文件
//int main()
//{
//	printf("%d", g_val);
//}

//⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
//1. 局部变量的⽣命周期是：进⼊作⽤域变量创建，⽣命周期开始，出作⽤域⽣命周期结束。
//2. 全局变量的⽣命周期是：整个程序的⽣命周期。

//8.3 static 和 extern
//static 和 extern 都是C语⾔中的关键字
/*
static 是 静态的 的意思，可以⽤来：
• 修饰局部变量
• 修饰全局变量
• 修饰函数
extern 是⽤来声明外部符号的
*/
//void test()
//{
//	//static修饰局部变量(编译的时候就有了i初始化为2,正式运行的时候这一句代码不执行)
//	static int i = 0;//i的生命周期变长,上一次的值没销毁，保留.
//	i++;
//	printf("%d ", i);
//}
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		test();
//	}
//	return 0;
//}
//结论：static修饰局部变量改变了变量的⽣命周期，⽣命周期改变的本质是改变了变量的存储类型，本
//来⼀个局部变量是存储在内存的栈区的，但是被 static 修饰后存储到了静态区。存储在静态区的变
//量和全局变量是⼀样的，⽣命周期就和程序的⽣命周期⼀样了，只有程序结束，变量才销毁，内存才
//回收。但是作⽤域不变的。

//8.3.2 static 修饰全局变量
//extern int g_val;//不能使用static修饰的全局变量
//int main()
//{
//	printf("%d", g_val);
//}
//结论：
//⼀个全局变量被static修饰，使得这个全局变量只能在本源⽂件内使⽤，不能在其他源⽂件内使⽤。
//本质原因是全局变量默认是具有外部链接属性的，在外部的⽂件中想使⽤，只要适当的声明就可以使
//⽤；但是全局变量被 static 修饰之后，外部链接属性就变成了内部链接属性，只能在⾃⼰所在的源
//⽂件内部使⽤了，其他源⽂件，即使声明了，也是⽆法正常使⽤的。
//使⽤建议：如果⼀个全局变量，只想在所在的源⽂件内部使⽤，不想被其他⽂件发现，就可以使⽤
//static 修饰。

//8.3.3 static 修饰函数
//同上
//函数默认是具有外部链接属性，具有外部链接属性
//但是被 static 修饰后变成了内部链接属性，使得函数只能在⾃⼰所在源⽂件内部使用